/**
 * 角色常量定义
 * 统一管理前端角色相关的字符串常量，避免硬编码
 * 符合《智慧社区微服务架构总览.md》权威标准
 * 
 * @author Wu.Liang
 * @date 2025-01-30
 * @updated 2025-01-30 - 精简常量声明，避免重复定义
 */

// ==================== 角色代码常量 ====================

/**
 * 角色代码常量 - 统一角色编码定义
 */
export const ROLE_CODES = {
  // 管理员角色
  SUPER_ADMIN: 'SUPER_ADMIN',
  ADMIN: 'admin',
  
  // 区域管理角色
  REGION_ADMIN: 'REGION_ADMIN',
  COMMUNITY_ADMIN: 'COMMUNITY_ADMIN',
  
  // 物业管理角色
  PROPERTY_ADMIN: 'PROPERTY_ADMIN',
  PROPERTY_STAFF: 'PROPERTY_STAFF',
  
  // 安防管理角色
  SECURITY_GUARD: 'SECURITY_GUARD',
  
  // 普通用户角色
  USER: 'USER'
} as const

// ==================== 角色名称常量 ====================

/**
 * 角色名称常量 - 统一角色显示名称
 */
export const ROLE_NAMES = {
  SUPER_ADMIN: '超级管理员',
  ADMIN: '系统管理员',
  REGION_ADMIN: '区域管理员',
  COMMUNITY_ADMIN: '社区管理员',
  PROPERTY_ADMIN: '物业管理员',
  PROPERTY_STAFF: '物业员工',
  SECURITY_GUARD: '安保人员',
  USER: '普通用户',
  UNKNOWN: '未知角色'
} as const

// ==================== 权限前缀常量 ====================

/**
 * 权限前缀常量 - 统一权限前缀定义
 */
export const PERMISSION_PREFIXES = {
  SUPER_ADMIN: 'super:admin:',
  ADMIN: 'system:admin:',
  REGION_ADMIN: 'region:admin:',
  COMMUNITY_ADMIN: 'community:admin:',
  PROPERTY_ADMIN: 'property:admin:',
  PROPERTY_STAFF: 'property:staff:',
  SECURITY_GUARD: 'security:guard:',
  USER: 'user:'
} as const

// ==================== 角色组常量 ====================

/**
 * 角色组常量 - 统一角色分组定义
 */
export const ROLE_GROUPS = {
  // 管理员角色组
  ADMIN_ROLES: [ROLE_CODES.SUPER_ADMIN, ROLE_CODES.ADMIN],
  
  // 区域管理角色组
  REGION_MANAGEMENT_ROLES: [ROLE_CODES.REGION_ADMIN, ROLE_CODES.COMMUNITY_ADMIN],
  
  // 物业管理角色组
  PROPERTY_MANAGEMENT_ROLES: [ROLE_CODES.PROPERTY_ADMIN, ROLE_CODES.PROPERTY_STAFF],
  
  // 安防管理角色组
  SECURITY_MANAGEMENT_ROLES: [ROLE_CODES.SECURITY_GUARD],
  
  // 所有管理角色组
  ALL_ADMIN_ROLES: [
    ROLE_CODES.SUPER_ADMIN,
    ROLE_CODES.ADMIN,
    ROLE_CODES.REGION_ADMIN,
    ROLE_CODES.COMMUNITY_ADMIN,
    ROLE_CODES.PROPERTY_ADMIN,
    ROLE_CODES.PROPERTY_STAFF,
    ROLE_CODES.SECURITY_GUARD
  ]
} as const

// ==================== 工具函数 ====================

/**
 * 检查是否为管理员角色
 * @param roleCode 角色代码
 * @returns 是否为管理员角色
 */
export function isAdminRole(roleCode: string): boolean {
  if (!roleCode) {
    return false
  }
  return ROLE_CODES.SUPER_ADMIN === roleCode || ROLE_CODES.ADMIN === roleCode
}

/**
 * 检查是否为超级管理员角色
 * @param roleCode 角色代码
 * @returns 是否为超级管理员角色
 */
export function isSuperAdminRole(roleCode: string): boolean {
  return ROLE_CODES.SUPER_ADMIN === roleCode
}

/**
 * 检查是否为区域管理角色
 * @param roleCode 角色代码
 * @returns 是否为区域管理角色
 */
export function isRegionManagementRole(roleCode: string): boolean {
  if (!roleCode) {
    return false
  }
  return ROLE_GROUPS.REGION_MANAGEMENT_ROLES.includes(roleCode as any)
}

/**
 * 检查是否为物业管理角色
 * @param roleCode 角色代码
 * @returns 是否为物业管理角色
 */
export function isPropertyManagementRole(roleCode: string): boolean {
  if (!roleCode) {
    return false
  }
  return ROLE_GROUPS.PROPERTY_MANAGEMENT_ROLES.includes(roleCode as any)
}

/**
 * 检查是否为安防管理角色
 * @param roleCode 角色代码
 * @returns 是否为安防管理角色
 */
export function isSecurityManagementRole(roleCode: string): boolean {
  if (!roleCode) {
    return false
  }
  return ROLE_GROUPS.SECURITY_MANAGEMENT_ROLES.includes(roleCode as any)
}

/**
 * 检查是否为管理角色
 * @param roleCode 角色代码
 * @returns 是否为管理角色
 */
export function isManagementRole(roleCode: string): boolean {
  if (!roleCode) {
    return false
  }
  return ROLE_GROUPS.ALL_ADMIN_ROLES.includes(roleCode as any)
}

/**
 * 获取角色名称
 * @param roleCode 角色代码
 * @returns 角色名称
 */
export function getRoleName(roleCode: string): string {
  if (!roleCode) {
    return ROLE_NAMES.UNKNOWN
  }
  
  switch (roleCode) {
    case ROLE_CODES.SUPER_ADMIN:
      return ROLE_NAMES.SUPER_ADMIN
    case ROLE_CODES.ADMIN:
      return ROLE_NAMES.ADMIN
    case ROLE_CODES.REGION_ADMIN:
      return ROLE_NAMES.REGION_ADMIN
    case ROLE_CODES.COMMUNITY_ADMIN:
      return ROLE_NAMES.COMMUNITY_ADMIN
    case ROLE_CODES.PROPERTY_ADMIN:
      return ROLE_NAMES.PROPERTY_ADMIN
    case ROLE_CODES.PROPERTY_STAFF:
      return ROLE_NAMES.PROPERTY_STAFF
    case ROLE_CODES.SECURITY_GUARD:
      return ROLE_NAMES.SECURITY_GUARD
    case ROLE_CODES.USER:
      return ROLE_NAMES.USER
    default:
      return ROLE_NAMES.UNKNOWN
  }
}

/**
 * 检查角色是否在指定角色组中
 * @param roleCode 角色代码
 * @param roleGroup 角色组
 * @returns 是否在角色组中
 */
export function isRoleInGroup(roleCode: string, roleGroup: readonly string[]): boolean {
  if (!roleCode || !roleGroup) {
    return false
  }
  return roleGroup.includes(roleCode)
}

/**
 * 获取角色权限前缀
 * @param roleCode 角色代码
 * @returns 权限前缀
 */
export function getRolePermissionPrefix(roleCode: string): string {
  if (!roleCode) {
    return PERMISSION_PREFIXES.USER
  }
  
  switch (roleCode) {
    case ROLE_CODES.SUPER_ADMIN:
      return PERMISSION_PREFIXES.SUPER_ADMIN
    case ROLE_CODES.ADMIN:
      return PERMISSION_PREFIXES.ADMIN
    case ROLE_CODES.REGION_ADMIN:
      return PERMISSION_PREFIXES.REGION_ADMIN
    case ROLE_CODES.COMMUNITY_ADMIN:
      return PERMISSION_PREFIXES.COMMUNITY_ADMIN
    case ROLE_CODES.PROPERTY_ADMIN:
      return PERMISSION_PREFIXES.PROPERTY_ADMIN
    case ROLE_CODES.PROPERTY_STAFF:
      return PERMISSION_PREFIXES.PROPERTY_STAFF
    case ROLE_CODES.SECURITY_GUARD:
      return PERMISSION_PREFIXES.SECURITY_GUARD
    case ROLE_CODES.USER:
      return PERMISSION_PREFIXES.USER
    default:
      return PERMISSION_PREFIXES.USER
  }
} 